/**
 * 对象存储工具函数
 * 用于获取对象存储中的文件URL
 */

// 存储访问凭证
const storageConfig = {
  externalEndpoint: 'https://objectstorageapi.bja.sealos.run',
  bucketName: 'a0qepsyj-001'
};

// 文件路径映射，可以根据实际情况扩展
const filePaths = {
  // 默认头像
  'default-avatar': 'miniprogram-cdn/default-avatar.png',
  // 新添加的默认头像
  'avatar-d907281-0': 'text/Default avatar/d907281-0.png',
  'avatar-d907281-1': 'text/Default avatar/d907281-1.png',
  'avatar-d928162-0': 'text/Default avatar/d928162-0.png',
  'avatar-d928162-1': 'text/Default avatar/d928162-1.png',
  
  // banner图片
  'banner1': 'miniprogram-cdn/banner1.png',
  'banner2': 'miniprogram-cdn/banner2.png',
  'banner3': 'miniprogram-cdn/banner3.png',
  
  // 图标
  'plus': 'miniprogram-cdn/plus.png',
  'eye': 'miniprogram-cdn/eye.png',
  'group': 'miniprogram-cdn/group.png',
  'more': 'miniprogram-cdn/more.png',
  
  // 新添加的系统图标
  'icon-watch-collect': 'text/System%20icon/%E5%9B%B4%E8%A7%82%E4%B8%8E%E6%94%B6%E8%97%8F.svg',
  'icon-system-notice': 'text/System%20icon/%E7%B3%BB%E7%BB%9F%E9%80%9A%E7%9F%A5.svg',
  'icon-comments': 'text/System%20icon/%E8%AF%84%E8%AE%BA%E4%B8%8E@.svg',
  'icon-customer-service': 'text/System%20icon/%E7%B3%BB%E7%BB%9F%E5%AE%A2%E6%9C%8D.svg',
  
  // 用户头像
  'user3': 'miniprogram-cdn/user3.png',
  'user4': 'miniprogram-cdn/user4.png',
  'user6': 'miniprogram-cdn/user6.png'
};

// URL缓存，避免重复生成
const urlCache = new Map();

/**
 * 获取对象存储文件的URL
 * @param {string} fileKey - 文件在filePaths中的键名
 * @returns {string} 完整的文件URL
 */
function getObjectURL(fileKey) {
  // 如果传入的是完整URL，直接返回
  if (fileKey.startsWith('http')) {
    return fileKey;
  }
  
  // 检查缓存
  if (urlCache.has(fileKey)) {
    return urlCache.get(fileKey);
  }
  
  // 如果传入的是文件键名，通过映射获取路径
  const filePath = filePaths[fileKey];
  if (!filePath) {
    console.error(`未找到文件路径映射: ${fileKey}`);
    return '/images/default-avatar.png'; // 返回本地默认图片路径
  }
  
  try {
    // 只编码需要编码的部分，保留已编码的部分
    // 检查路径是否已经被编码
    let encodedPath = filePath;
    if (!filePath.includes('%')) {
      // 如果路径未被编码，则进行编码，但保留斜杠
      encodedPath = filePath.split('/').map(segment => 
        encodeURIComponent(segment)
      ).join('/');
    }
    
    // 构建完整URL
    const url = `${storageConfig.externalEndpoint}/${storageConfig.bucketName}/${encodedPath}`;
    
    // 缓存URL
    urlCache.set(fileKey, url);
    console.log(`生成URL成功: ${fileKey} -> ${url}`);
    
    return url;
  } catch (error) {
    console.error(`生成对象URL失败: ${fileKey}`, error && error.message);
    return '/images/default-avatar.png'; // 失败时返回本地默认图片
  }
}

/**
 * 从cdn URL转换为对象存储键名
 * @param {string} url - 完整的cdn URL
 * @returns {string} 文件键名
 */
function getKeyFromURL(url) {
  if (!url || typeof url !== 'string') {
    return 'default-avatar';
  }
  
  // 从URL中提取文件名
  const fileName = url.split('/').pop();
  if (!fileName) {
    return 'default-avatar';
  }
  
  // 去掉文件扩展名
  const fileKey = fileName.split('.')[0];
  return fileKey;
}

/**
 * 清除URL缓存
 * @param {string} fileKey - 可选，指定清除的文件键名
 */
function clearURLCache(fileKey) {
  if (fileKey) {
    urlCache.delete(fileKey);
    
    // 同时清除微信图片缓存
    clearWxImageCache(fileKey);
  } else {
    urlCache.clear();
    
    // 清除所有微信图片缓存
    clearAllWxImageCache();
  }
}

/**
 * 清除微信图片缓存
 * @param {string} url - 图片URL
 */
function clearWxImageCache(url) {
  // 如果是键名，转换为URL
  if (!url.startsWith('http')) {
    url = getObjectURL(url);
  }
  
  console.log(`清除图片缓存: ${url}`);
  
  // 尝试使用removeStorageSync清除缓存
  try {
    wx.removeStorageSync(`image_cache_${url}`);
  } catch(e) {
    console.error('清除缓存失败:', e);
  }
  
  // 强制微信刷新图片缓存
  wx.getImageInfo({
    src: url + '?t=' + Date.now(), // 添加时间戳强制刷新
    success: () => {
      console.log(`强制刷新图片缓存成功: ${url}`);
    },
    fail: (err) => {
      console.error(`强制刷新图片缓存失败: ${url}`, err);
    }
  });
}

/**
 * 清除所有微信图片缓存
 */
function clearAllWxImageCache() {
  console.log('开始清除所有图片缓存');
  
  // 清除头像缓存
  for (let i = 0; i < 4; i++) {
    clearWxImageCache(getDefaultAvatarURL(i));
  }
  
  // 清除系统图标缓存
  ['system-notice', 'watch-collect', 'comments', 'customer-service'].forEach(iconType => {
    clearWxImageCache(getSystemIconURL(iconType));
  });
  
  // 清除当前用户头像缓存
  try {
    const userInfo = wx.getStorageSync('userInfo');
    if (userInfo && userInfo.avatarUrl) {
      clearWxImageCache(userInfo.avatarUrl);
    }
  } catch (e) {
    console.error('清除用户头像缓存失败:', e);
  }
  
  console.log('图片缓存清除完成');
}

/**
 * 重新加载图片
 * @param {string} url - 图片URL
 * @returns {Promise} - 重新加载结果
 */
function reloadImage(url) {
  return new Promise((resolve, reject) => {
    // 清除缓存
    clearWxImageCache(url);
    
    // 重新加载
    wx.getImageInfo({
      src: url + '?t=' + Date.now(),
      success: resolve,
      fail: reject
    });
  });
}

/**
 * 获取默认头像URL
 * @param {number} index - 头像索引 (0-3)
 * @returns {string} 头像URL
 */
function getDefaultAvatarURL(index = 0) {
  const avatarKeys = [
    'avatar-d907281-0',
    'avatar-d907281-1',
    'avatar-d928162-0',
    'avatar-d928162-1'
  ];
  
  // 确保索引在有效范围内
  const validIndex = Math.min(Math.max(0, index), avatarKeys.length - 1);
  return getObjectURL(avatarKeys[validIndex]);
}

/**
 * 获取系统图标URL
 * @param {string} iconType - 图标类型
 * @returns {string} 图标URL
 */
function getSystemIconURL(iconType) {
  const iconMap = {
    'watch-collect': 'icon-watch-collect',
    'system-notice': 'icon-system-notice',
    'comments': 'icon-comments',
    'customer-service': 'icon-customer-service'
  };
  
  const iconKey = iconMap[iconType];
  if (!iconKey) {
    console.error(`未找到图标类型映射: ${iconType}`);
    return '';
  }
  
  return getObjectURL(iconKey);
}

// 预加载常用图片资源
function preloadResources() {
  console.log("预加载资源...");
  // 预加载头像
  getDefaultAvatarURL(0);
  getDefaultAvatarURL(1);
  getDefaultAvatarURL(2);
  getDefaultAvatarURL(3);
  
  // 预加载系统图标
  getSystemIconURL('system-notice');
  getSystemIconURL('watch-collect');
  getSystemIconURL('comments');
  getSystemIconURL('customer-service');
  
  console.log("资源预加载完成");
}

// 导出时预加载常用资源
preloadResources();

module.exports = {
  getObjectURL,
  getKeyFromURL,
  getDefaultAvatarURL,
  getSystemIconURL,
  clearURLCache,
  clearWxImageCache,
  clearAllWxImageCache,
  reloadImage
}; 